import urllib.request
import urllib.parse

"""
    我们知道利用 urlopen 方法可以实现最基本请求的发起，但这几个简单的参数并不足以构建一个完整的请求。如果请求中需要加入 Headers 等信息，就可以利用更强大的 Request 类来构建。
    class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
    
    其中，第一个参数 url 用于请求 URL，这是必传参数，其他都是可选参数。

    第二个参数 data 如果要传，必须传 bytes（字节流）类型的。如果它是字典，可以先用 urllib.parse 模块里的 urlencode() 编码。
    
    第三个参数 headers 是一个字典，它就是请求头。我们在构造请求时，既可以通过 headers 参数直接构造，也可以通过调用请求实例的 add_header() 方法添加。
    
    添加请求头最常用的方法就是通过修改 User-Agent 来伪装浏览器。默认的 User-Agent 是 Python-urllib，我们可以通过修改它来伪装浏览器。比如要伪装火狐浏览器，你可以把它设置为：Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11
    第四个参数 origin_req_host 指的是请求方的 host 名称或者 IP 地址。

    第五个参数 unverifiable 表示这个请求是否是无法验证的，默认是 False，意思就是说用户没有足够权限来选择接收这个请求的结果。例如，我们请求一个 HTML 文档中的图片，但是我们没有自动抓取图像的权限，这时 unverifiable 的值就是 True。
    
    第六个参数 method 是一个字符串，用来指示请求使用的方法，比如 GET、POST 和 PUT 等。

"""

# 准备参数
url = 'https://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Host': 'httpbin.org'
}
query_str = urllib.parse.urlencode({'name': 'jack'})
data = bytes(query_str, encoding='utf-8')
# 创建 Request类
# request = urllib.request.Request(url=url, data=data, headers=headers, method='POST')

# 添加header的其他方式
request = urllib.request.Request(url=url, data=data, method='POST')
request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')

# 请求中传入 Request类的对象
response = urllib.request.urlopen(request, timeout=5)
print(response.read().decode('utf-8'))
